using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;

public partial class Comparativo : System.Web.UI.Page
{
    protected void Comparar_Click(object sender, EventArgs e)
    {
        bool dois = Data2.Checked;
        OleDbConnection cnn = new OleDbConnection(ConfigurationManager.AppSettings["strcnn"]);
        cnn.Open();
        OleDbCommand Fabricas;
        if (dois) Fabricas = new OleDbCommand("SELECT DISTINCT Pedido.IDFabrica, Fabrica.RazaoSocial FROM Fabrica INNER JOIN Pedido ON Fabrica.ID = Pedido.IDFabrica GROUP BY Pedido.IDFabrica, Fabrica.RazaoSocial, Month(Data), Year(Data) HAVING Sum(Pedido.Total)<>0 AND (Month(Data)=" + Mes1.SelectedValue + " AND Year(Data)=" + Ano1.SelectedValue + ") OR (Month(Data)=" + Mes2.SelectedValue + " AND Year(Data)=" + Ano2.SelectedValue + ") ORDER BY Fabrica.RazaoSocial", cnn);
        else Fabricas = new OleDbCommand("SELECT DISTINCT Pedido.IDFabrica, Fabrica.RazaoSocial FROM Fabrica INNER JOIN Pedido ON Fabrica.ID = Pedido.IDFabrica GROUP BY Pedido.IDFabrica, Fabrica.RazaoSocial, Month(Data), Year(Data) HAVING Sum(Pedido.Total)<>0 AND (Month(Data)=" + Mes1.SelectedValue + " AND Year(Data)=" + Ano1.SelectedValue + ") ORDER BY Fabrica.RazaoSocial", cnn);
        OleDbCommand Vendedores = new OleDbCommand("SELECT ID, Nome FROM Vendedor ORDER BY Nome", cnn);
        OleDbDataReader DRFabricas = Fabricas.ExecuteReader();
        OleDbDataReader DRVendedores = Vendedores.ExecuteReader();

        TableRow Linha, LinhaDatas;
        List<Info> ListaFabricas = new List<Info>();

        Linha = new TableRow();
        InserirCelula(Linha, "", 1, Tipos.Fabrica);
        LinhaDatas = new TableRow();
        InserirCelula(LinhaDatas, "Data", 1, Tipos.Data);
        while (DRFabricas.Read())
        {
            InserirCelula(Linha, (string)DRFabricas["RazaoSocial"], dois ? 2 : 1, Tipos.Fabrica);
            ListaFabricas.Add(new Info((int)DRFabricas["IDFabrica"]));
            InserirCelula(LinhaDatas, Mes1.SelectedValue + "/" + Ano1.SelectedValue, 1, Tipos.Data);
            if (dois) InserirCelula(LinhaDatas, Mes2.SelectedValue + "/" + Ano2.SelectedValue, 1, Tipos.Data);
        }
        InserirCelula(Linha, "Total", dois ? 2 : 1, Tipos.Fabrica);
        InserirCelula(LinhaDatas, Mes1.SelectedValue + "/" + Ano1.SelectedValue, 1, Tipos.Data);
        if (dois) InserirCelula(LinhaDatas, Mes2.SelectedValue + "/" + Ano2.SelectedValue, 1, Tipos.Data);
        Tabela.Rows.Add(Linha);
        Tabela.Rows.Add(LinhaDatas);

        while (DRVendedores.Read())
        {
            double Total1 = 0, Total2 = 0;
            Linha = new TableRow();
            InserirCelula(Linha, (string)DRVendedores["Nome"], 1, Tipos.Vendedor);
            OleDbDataReader Totais1 = Totais(cnn, (int)DRVendedores["ID"], Mes1.SelectedValue, Ano1.SelectedValue);
            OleDbDataReader Totais2 = Totais(cnn, (int)DRVendedores["ID"], Mes2.SelectedValue, Ano2.SelectedValue);
            if (dois) Totais2.Read();
            Totais1.Read();

            foreach (Info i in ListaFabricas)
            {
                try
                {
                    if ((int)Totais1["IDFabrica"] == i.IDFabrica)
                    {
                        InserirCelula(Linha, Convert.ToDouble(Totais1["Total"]).ToString("0.00"), 1, Tipos.Total1);
                        Total1 += Convert.ToDouble(Totais1["Total"]);
                        i.T1 += Convert.ToDouble(Totais1["Total"]);
                        Totais1.Read();
                    }
                    else InserirCelula(Linha, "0,00", 1, Tipos.Total1);
                }
                catch
                {
                    InserirCelula(Linha, "0,00", 1, Tipos.Total1);
                }
                if (dois)
                {
                    try
                    {
                        if ((int)Totais2["IDFabrica"] == i.IDFabrica)
                        {
                            InserirCelula(Linha, Convert.ToDouble(Totais2["Total"]).ToString("0.00"), 1, Tipos.Total2);
                            Total2 += Convert.ToDouble(Totais2["Total"]);
                            i.T2 += Convert.ToDouble(Totais2["Total"]);
                            Totais2.Read();
                        }
                        else InserirCelula(Linha, "0,00", 1, Tipos.Total2);
                    }
                    catch
                    {
                        InserirCelula(Linha, "0,00", 1, Tipos.Total2);
                    }
                }
            }
            Totais1.Close();
            if (dois) Totais2.Close();
            InserirCelula(Linha, Total1.ToString("0.00"), 1, Tipos.Total1);
            if (dois) InserirCelula(Linha, Total2.ToString("0.00"), 1, Tipos.Total2);
            Tabela.Rows.Add(Linha);
        }

        Linha = new TableRow();
        InserirCelula(Linha, "Total", 1, Tipos.Vendedor);
        double T1 = 0, T2 = 0;
        foreach (Info i in ListaFabricas)
        {
            T1 += i.T1;
            if (dois) T2 += i.T2;
            InserirCelula(Linha, i.T1.ToString("0.00"), 1, Tipos.Total1);
            if (dois) InserirCelula(Linha, i.T2.ToString("0.00"), 1, Tipos.Total2);
        }
        InserirCelula(Linha, T1.ToString("0.00"), 1, Tipos.Total1);
        if (dois) InserirCelula(Linha, T2.ToString("0.00"), 1, Tipos.Total2);
        Tabela.Rows.Add(Linha);

        DRFabricas.Close();
        DRVendedores.Close();
        cnn.Close();
    }

    private static OleDbDataReader Totais(OleDbConnection cnn, int IDVendedor, string Mes, string Ano)
    {
        string strsql = "SELECT Sum(Pedido.Total) AS Total, Pedido.IDFabrica " +
            "FROM Fabrica INNER JOIN Pedido ON Fabrica.ID = Pedido.IDFabrica " +
            "GROUP BY Pedido.IDFabrica, Fabrica.RazaoSocial, Pedido.IDVendedor, Month(Data), Year(Data) " +
            "HAVING Month(Data)=" + Mes + " AND Year(Data)=" + Ano + " AND Pedido.IDVendedor=" + IDVendedor + " " +
            "ORDER BY Fabrica.RazaoSocial";
        return (new OleDbCommand(strsql, cnn).ExecuteReader());
    }

    private class Info
    {
        public int IDFabrica;
        public double T1 = 0, T2 = 0;
        public Info(int IDFabrica)
        {
            this.IDFabrica = IDFabrica;
        }
    }

    private static void InserirCelula(TableRow Linha, string Texto, int ColSpan, Tipos Tipo)
    {
        TableCell Celula = new TableCell();
        Celula.Text = Texto == "0,00" ? "" : Texto;
        Celula.ColumnSpan = ColSpan;
        switch (Tipo)
        {
            case Tipos.Fabrica:
                Celula.BackColor = Color.DarkBlue;
                Celula.ForeColor = Color.White;
                Celula.Font.Bold = true;
                break;
            case Tipos.Data:
                Celula.BackColor = Color.DarkGreen;
                Celula.ForeColor = Color.LightGreen;
                Celula.HorizontalAlign = HorizontalAlign.Center;
                break;
            case Tipos.Vendedor:
                Celula.BackColor = Color.Gray;
                Celula.Font.Bold = true;
                break;
            case Tipos.Total1:
                Celula.BackColor = Color.FromArgb(173, 216, 230);
                Celula.HorizontalAlign = HorizontalAlign.Center;
                break;
            case Tipos.Total2:
                Celula.BackColor = Color.FromArgb(224, 255, 255);
                Celula.HorizontalAlign = HorizontalAlign.Center;
                break;
            default:
                break;
        }
        Linha.Cells.Add(Celula);
    }

    private enum Tipos
    {
        Fabrica,
        Data,
        Vendedor,
        Total1,
        Total2,
    }
}